home *** CD-ROM | disk | FTP | other *** search
/ Aminet 41 / Aminet 41 (2001)(Schatztruhe)[!][Feb 2001].iso / Aminet / gfx / edit / AmiCAD_2.07.lha / AmiCAD / ARexx / TracerSpice.AmiCAD < prev    next >
Text File  |  2000-11-12  |  8KB  |  277 lines

  1. /* Tracé d'un fichier généré par Spice dans la fenêtre AmiCAD courante */
  2. /* Version 1.01: 27 Mai 1999, modification appel MENU */
  3. /* Version 1.02: 4 octobre 1999, ajout affichage point de fonctionnement */
  4. /* Version 1.03: 18 octobre 1999, amélioration affichage point de fonctionnement */
  5. /* Version 1.04: 13 avril 2000, adaptation à la version 2.05 */
  6. /* Version 1.05: 12 novembre 2000, localisation anglais/français */
  7. /* $VER: 1.05 (© R.Florac, 12/11/2000) */
  8.  
  9. options results     /* indispensable pour récupérer le résultat des macros */
  10.  
  11. signal on error     /* pour l'interception des erreurs */
  12. signal on syntax
  13.  
  14. 'LANGUAGE'
  15. if result="français.language" then fr=1
  16. else fr=0
  17.  
  18. parse arg '"'fichier'"'port
  19.  
  20. if port~="" then address value port
  21.  
  22. if fichier="" then do
  23.     if fr=1 then 'REQFILE("Fichier Spice","RAM:","*_spice")'
  24.     else 'REQFILE("Spice file","RAM:","*_spice")'
  25.     fichier=result
  26. end
  27. if fichier="" then exit
  28. if ~open(file, fichier, 'R') then do
  29.     if fr=1 then 'MESSAGE("Fichier de données"+CHR(10)+"'fichier'"+CHR(10)+"non trouvé")'
  30.     else 'MESSAGE("Data file"+CHR(10)+"'fichier'"+CHR(10)+"not found")'
  31.     return
  32. end
  33.  
  34. titre=readln(file)
  35. if left(titre,6)~="Title:" then do
  36.     titre='ARexx/FixQuotes'(titre)
  37.     if fr=1 then 'MESSAGE("Fichier de type inconnu"+CHR(10)+"En-tête:"+CHR(10)+"'titre'"):TITLE("")'
  38.     else 'MESSAGE("Unknown file type"+CHR(10)+"Header:"+CHR(10)+"'titre'"):TITLE("")'
  39.     close(file)
  40.     exit
  41. end
  42.  
  43. if fr=1 then 'LOCK:TITLE("Lecture des données...")'
  44. else 'LOCK:TITLE("Reading datas...")'
  45.  
  46. date=readln(file)
  47. plotname=readln(file)
  48. flags=substr(readln(file),8)
  49. nv=readln(file)
  50. nv=substr(nv,16)
  51. np=readln(file)
  52. np=substr(np,13)
  53. command=readln(file)
  54. v=readln(file)
  55. if v~="Variables:" then do
  56.     if fr=1 then 'UNLOCK:MESSAGE("Déclaration variables"+CHR(10)+"non trouvée"):TITLE("")'
  57.     else 'UNLOCK:MESSAGE("Variables header"+CHR(10)+"not found"):TITLE("")'
  58.     close(file)
  59.     exit
  60. end
  61.  
  62. v.0=readln(file)
  63. parse value v.0 with '09'x num '09'x nom '09'x type.0
  64. type_abcisse=type.0
  65. if nom="sweep" then type_analyse="DC"
  66. else if nom="time" then type_analyse="TRANSIENT"
  67. else if nom="frequency" then type_analyse="AC"
  68. else do
  69.     type_analyse="OP"
  70.     nom.0=nom
  71. end
  72.  
  73. if type_analyse~="OP" then do
  74.     'SAVEALL:MODE_TRACÉ=DRAWMODE(1):ROTATE(0,0):SETSCALE(0,100,100)'
  75.     'IF(OBJECTS>0,MARKZONE(0,0,WWIDTH-1,WHEIGHT-1):MENU("Delete"),0)'
  76.     'WRITE("'substr(titre,8)||' ('||substr(plotname,11)')",15,15)'
  77.     'WRITE("Spice 'substr(command,10)||' '||substr(date,7)'",15,25)'
  78. end
  79.  
  80. do i=1 to nv-1
  81.     v.i=readln(file)
  82.     parse value v.i with '09'x num '09'x nom.i '09'x type.i
  83. end
  84. v=readln(file)
  85. if v~="Values:" then do
  86.     if fr=1 then 'UNLOCK:MESSAGE("Déclaration valeurs"+CHR(10)+"non trouvée")'
  87.     else 'UNLOCK:MESSAGE("Values header"+CHR(10)+"not found")'
  88.     close(file)
  89.     exit
  90. end
  91.  
  92. do i=0 to np-1
  93.     v=readln(file)
  94.     if flags = 'real' then do
  95.     parse var v p '09'x '09'x valeur
  96.     end
  97.     else parse var v p '09'x '09'x valeur ',' imaginaire
  98.     if p~=i then do
  99.     if fr=1 then 'UNLOCK:MESSAGE("Erreur de lecture"+CHR(10)+"des données"+CHR(10)+"'p'"):TITLE("")'
  100.     else 'UNLOCK:MESSAGE("Error reading"+CHR(10)+"datas"+CHR(10)+"'p'"):TITLE("")'
  101.     close(file)
  102.     exit
  103.     end
  104.     xh.i=valeur
  105.     im.i=imaginaire
  106.     if type_analyse="OP" then yd.0.0=valeur
  107.     do j=1 to nv-1
  108.     v=readln(file)
  109.     if flags='real' then parse var v '09'x p
  110.     else parse var v '09'x p ',' imaginaire
  111.     yd.i.j=p
  112.     im.i.j=imaginaire
  113.     end
  114. end
  115.  
  116. if type_analyse~="OP" then do
  117.     /* recherche des limites des ordonnées (axe vertical) */
  118.     ymin=yd.0.1
  119.     ymax=yd.0.1
  120.     do i=0 to np-1
  121.     do j=1 to nv-1
  122.         if ymin>yd.i.j then ymin=yd.i.j
  123.         if ymax<yd.i.j then ymax=yd.i.j
  124.     end
  125.     end
  126.  
  127.     /* Lecture des dimensions de la fenêtre */
  128.     xgauche=70
  129.     'WWIDTH'
  130.     largeur=result-xgauche-30
  131.     yhaut=40
  132.     'WHEIGHT'
  133.     hauteur=result-yhaut-65
  134.  
  135.     /* Tracé du cadre */
  136.     if fr=1 then 'TITLE("Tracé des résultats...")'
  137.     else 'TITLE("Ploting results...")'
  138.     call tracer_contour
  139.  
  140.     /* Tracé de la grille */
  141.     lc=largeur%10        /* Lignes verticales */
  142.     xc=xgauche+lc
  143.     do i=1 to 9
  144.     'DRAW('xc','yhaut','xc','yhaut'+'hauteur')'
  145.     xc=xc+lc
  146.     end
  147.  
  148.     yl=hauteur%10        /* Lignes horizontales */
  149.     do i=1 to 9
  150.     'DRAW('xgauche','yhaut+yl*i','xgauche+largeur','yhaut+yl*i')'
  151.     end
  152.  
  153.     /* Tracé des légendes */
  154.     NUMERIC FORM ENGINEERING
  155.     NUMERIC DIGITS 5
  156.     'DRAWMODE(1):ROTATE(0,3)'   /* Axe horizontal */
  157.     xc=xgauche+5
  158.     do i=0 to 10
  159.     rang=(np%10)*i
  160.     if rang>=np then rang=np-1
  161.     t=xh.rang
  162.     'WRITE("'left(t-0,6)'",'xc',WHEIGHT-10)'
  163.     xc=xc+lc
  164.     end
  165.     'WRITE("'type_abcisse'",'xc+15-lc',WHEIGHT-10)'
  166.  
  167.     if ymax-ymin>1 then do    /* Axe vertical */
  168.     ymin=(ymin-1)%1
  169.     ymax=(ymax+1)%1
  170.     end
  171.     'ROTATE(0,0)'
  172.     yl=hauteur%10
  173.     do i=0 to 10
  174.     rang=((ymax-ymin)/10)*i+ymin
  175.     if abs(rang)<0.00001 then rang=0
  176.     'WRITE("'left(rang-0,6,' ')'",'xgauche-50','hauteur-yl*i+yhaut')'
  177.     end
  178.  
  179.     /* Tracé des courbes */
  180.     pas_valeur=1
  181.     pas_x=largeur/np
  182.     do j=1 to nv-1
  183.     i=0
  184.     x0=xgauche
  185.     y0=calcul_ordonnee(yd.0.j)
  186.     if j<4 then 'DRAWMODE('j')'
  187.     else 'DRAWMODE('0-j')'
  188.     do while i<np
  189.         v=yd.i.j
  190.         if result<1 then leave
  191.         'DRAW('x0','y0','xgauche+(pas_x*i)%1','calcul_ordonnee(v)')'
  192.         x0=xgauche+(pas_x*i)%1
  193.         y0=calcul_ordonnee(v)
  194.         i=i+pas_valeur
  195.     end
  196.     'WWIDTH-'length(nom.j)*8'-20'; xn=result
  197.     'DRAW('xn-5','j*10','xn-15','j*10')'
  198.     'DRAWMODE(1):WRITE("'nom.j'",'xn','j*10+5')'
  199.     end
  200.     type_ordonnee=type.1
  201.     do j=1 to nv-1
  202.     if type_ordonnee~=type.j then do
  203.         type_ordonnee=''
  204.         leave
  205.     end
  206.     end
  207.     if type_ordonnee~='' then 'WRITE("'type_ordonnee'",'xgauche-50','yhaut-5')'
  208.     'DRAWMODE(MODE_TRACÉ)'
  209. end
  210. else do
  211.     if fr=1 then m='"Point de fonctionnement"'
  212.     else m='"Operating point"'
  213.     do j=0 to nv-1
  214.     NUMERIC FORM ENGINEERING
  215.     /* NUMERIC DIGITS 5 */
  216.     val=yd.0.j-0
  217.     k=j
  218.     if type.k='voltage' then do
  219.         units='V'
  220.         if fr=1 then type='Tension'
  221.         else type='Voltage'
  222.     end
  223.     else do
  224.         units='A'
  225.         if fr=1 then type='Courant'
  226.         else type='Current'
  227.         val=0-val
  228.     end
  229.     if abs(val) < 1 then do
  230.         val = val * 1000
  231.         if abs(val) < 1 then do
  232.         val = val * 1000
  233.         if abs(val) < 1 then do
  234.             val = val * 1000
  235.             units='n'||units
  236.         end
  237.         else do
  238.             if abs(val) < 1 then do
  239.             val = val * 1000
  240.             units='p'||units
  241.             end
  242.             else units='µ'||units
  243.         end
  244.         end
  245.         else units='m'||units
  246.     end
  247.     m = m||'+CHR(10)+"'||type' 'nom.j||': '||val||' '||units||'"'
  248.     end
  249.     'MESSAGE('m')'
  250. end
  251.  
  252. 'UNLOCK:TITLE("")'
  253. close(file)
  254. exit
  255.  
  256. calcul_ordonnee: procedure expose ymin ymax hauteur yhaut
  257.     parse arg v
  258.     if ymax=ymin then return 0
  259.     return hauteur-((abs(v-ymin)*hauteur/abs(ymax-ymin))%1)+yhaut
  260.  
  261. tracer_contour:
  262.     'SETFILL(0):DRAWMODE(-2):DRAW('xgauche','yhaut','xgauche','yhaut+hauteur'):DRAW('xgauche','yhaut+hauteur','xgauche+largeur','yhaut+hauteur')'
  263.     'DRAW('xgauche+largeur','yhaut+hauteur','xgauche+largeur','yhaut'):DRAW('xgauche+largeur','yhaut','xgauche','yhaut'):DRAWMODE(0)'
  264.     return
  265.  
  266. /* Traitement des erreurs, interruption du programme */
  267. syntax:
  268. erreur=RC
  269. if fr=1 then 'MESSAGE("Script TracerSpice.AmiCAD"+CHR(10)+"Erreur de syntaxe"+CHR(10)+"en ligne 'SIGL'"+CHR(10)+"'errortext(erreur)'"):UNLOCK'
  270. else 'MESSAGE("TracerSpice.AmiCAD script"+CHR(10)+"Syntax error"+CHR(10)+"in line 'SIGL'"+CHR(10)+"'errortext(erreur)'"):UNLOCK'
  271. exit
  272.  
  273. error:
  274. if fr=1 then 'MESSAGE("Script TracerSpice.AmiCAD"+CHR(10)+"Erreur en ligne 'SIGL'"):UNLOCK'
  275. else 'MESSAGE("TracerSpice.AmiCAD script"+CHR(10)+"Error in line 'SIGL'"):UNLOCK'
  276. exit
  277.